package eshop.local.logic;

import java.awt.BorderLayout;
import java.io.*;
import java.net.*;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import eshop.local.ui.EshopServerGUI;
import eshop.local.ui.MyWindowCloser;
import eshop.local.valueobjects.Artikel;
import eshop.local.valueobjects.Basket;
import eshop.local.valueobjects.Kunde;
import eshop.local.valueobjects.Mitarbeiter;
import eshop.local.valueobjects.Rechnung;
import eshop.local.valueobjects.Transfer;
 
public class EshopServer implements Runnable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	ServerSocket providerSocket;
	Socket connection = null;
	ObjectOutputStream out;
	ObjectInputStream in;
	
	Object input;
	

	private String saveArtikel = "ShopSave_A";
	private String saveKunde = "ShopSave_K";
	private String saveMitarbeiter = "ShopSave_M";
	private String saveTransfer = "ShopSave_T";
	private String saveRechnungen = "ShopSave_R";
	
	
	/**
	 * @param args
	 */
	
	private ShopVerwaltung shopVerw; 

	public EshopServer() throws IOException, ClassNotFoundException {
		
		shopVerw = new ShopVerwaltung();
		EshopServerGUI gui = new EshopServerGUI("Localhost : 5678");
	
		//1. creating a server socket
		providerSocket = new ServerSocket(5678);
		//2. Wait for connection
		System.out.println("# Waiting for connection");

		
	}
	

	
	public void run() {
		
		do {
			
			try {
				String eingabe = "";
				int zahl;
				
				
				connection = providerSocket.accept();
				System.out.println("# Connection received from " + connection.getInetAddress().getHostName());
				//3. get Input and Output streams
				out = new ObjectOutputStream(connection.getOutputStream());
			//	out.flush();
				in = new ObjectInputStream(connection.getInputStream());
				
				

				input = (String)in.readObject();
				
				if (input.equals("quit")) {
					// nichts tun, Schleifenende
					} else if (input.equals("suche")){
						eingabe = (String)in.readObject();
						List<Object> suche = shopVerw.suche(eingabe);
						out.writeObject(suche);
					/*
					 * * Artikel
					 */
					} else if (input.equals("gibAlleArtikel")){
						List<Artikel> gibAlleArtikel = shopVerw.gibAlleArtikel();
						out.writeObject(gibAlleArtikel);
					} else if (input.equals("sucheNachArtikel")){
						eingabe = (String)in.readObject();
						List<Artikel> sucheArtikel = shopVerw.sucheNachArtikel(eingabe);
						out.writeObject(sucheArtikel);
					} else if (input.equals("gibArtikelMitNummer")){
						zahl = (Integer)in.readObject();
						Artikel a = shopVerw.gibArtikelMitNummer(zahl);
						out.writeObject(a);
					} else if (input.equals("artikelHinzufuegen")){
						Artikel a = (Artikel)in.readObject();
						shopVerw.artikelHinzufuegen(a);
					} else if (input.equals("vergebeArtikelNummer")){
						int artikelNummer = shopVerw.vergebeArtikelNummer();
						out.writeObject(artikelNummer);
					} else if (input.equals("bearbeiteArtikel")){
						int n = (Integer)in.readObject();
						String p = (String)in.readObject();
						String v = (String)in.readObject();
						int u = (Integer)in.readObject();
						shopVerw.bearbeiteArtikel(n,p, v, u);
					} else if (input.equals("artikelSpeichern")){
						shopVerw.artikelSpeichern(saveArtikel);
					/*
					 * * Kunde
					 */
					} else if (input.equals("gibAlleKunden")){
						List<Kunde> kunden = shopVerw.gibAlleKunden();
						out.writeObject(kunden);
					} else if (input.equals("sucheNachKunde")){
						eingabe = (String)in.readObject();
						List<Kunde> sucheKunden = shopVerw.sucheNachKunde(eingabe);
						out.writeObject(sucheKunden);
					} else if (input.equals("gibKundeMitNummer")){	
						zahl = (Integer)in.readObject();
						Kunde kunde = (Kunde)shopVerw.gibKundeMitNummer(zahl);
						out.writeObject(kunde);
					} else if (input.equals("kundenHinzufuegen")){	
						Kunde kunde = (Kunde)in.readObject();
						shopVerw.kundenHinzufuegen(kunde);
						boolean ok = shopVerw.kundenHinzufuegen(kunde);
						if (ok = true){
						out.writeObject("Done");
						} else {
							out.writeObject("Fail");
						}
					} else if (input.equals("vergebeKundenNummer")){
						int kundenNummer = shopVerw.vergebeKundenNummer();
						out.writeObject(kundenNummer);
					} else if (input.equals("bearbeiteKunde")){
						String n = (String)in.readObject();
						String p = (String)in.readObject();
						String v = (String)in.readObject();
						shopVerw.bearbeiteKunde(n,p, v);
					} else if (input.equals("kundenEntfernen")){
						Kunde kunde = (Kunde)in.readObject();
						shopVerw.kundenEntfernen(kunde);
					} else if (input.equals("kundeSpeichern")){
						shopVerw.kundeSpeichern(saveKunde);
					/*
					* * Mitarbeiter
					 */		
					} else if (input.equals("gibAlleMitarbeiter")){
						List<Mitarbeiter> mitarbeiter = shopVerw.gibAlleMitabeiter();
						out.writeObject(mitarbeiter);
					} else if (input.equals("sucheNachMitarbeiter")){
						input = (String)in.readObject();
						List<Mitarbeiter> sucheMitarbeiter = shopVerw.sucheNachMitarbeiter(eingabe);
						out.writeObject(sucheMitarbeiter);
					} else if (input.equals("vergebeMitarbeiterNummer")){
						int MitarbeiterNummer = shopVerw.vergebeMitarbeiterNummer();
						out.writeObject(MitarbeiterNummer);
					} else if (input.equals("gibMitarbeiterMitNummer")){
						zahl = (Integer)in.readObject();
						Mitarbeiter mitarbeiter = shopVerw.gibMitarbeiterMitNummer(zahl);
						out.writeObject(mitarbeiter);
					} else if (input.equals("mitarbeiterHinzufuegen")){
						Mitarbeiter mitarbeiter = (Mitarbeiter)in.readObject();
						shopVerw.mitarbeiterhinzufuegen(mitarbeiter);
					} else if (input.equals("bearbeiteMitarbeiter")){
						String n = (String)in.readObject();
						String p = (String)in.readObject();
						String v = (String)in.readObject();
						shopVerw.bearbeiteMitarbeiter(n,p, v);
					} else if (input.equals("mitarbeiterentfernen")){
						Mitarbeiter mitarbeiter = (Mitarbeiter)in.readObject();
						shopVerw.mitarbeiterentfernen(mitarbeiter);
					} else if (input.equals("mitarbeiterSpeichern")){
						shopVerw.mitarbeiterSpeichern(saveMitarbeiter);
					/*
					* * Warenkorb
					 */	
					} else if (input.equals("gebeWarenkorbAb")){	
						Basket basket = (Basket)in.readObject();
						shopVerw.gebeWarenkorbAb(basket);
					/*
					* * Transfer
					 */	
					} else if (input.equals("gibAlleTransfer")){
						List<Transfer> transfer = shopVerw.gibAlleTransfer();
						out.writeObject(transfer);
					} else if (input.equals("tranferSpeichern")){
						shopVerw.tranferSpeichern(saveTransfer);
					} else if (input.equals("gibRechnungMitNummer")){	
						zahl = (Integer)in.readObject();
						Rechnung rechnung = (Rechnung)shopVerw.gibRechnungMitNummer(zahl);
						out.writeObject(rechnung);
					} else if (input.equals("rechnungenSpeichern")){
						shopVerw.rechnungenSpeichern(saveTransfer);
					} else if (input.equals("allesSpeichern")){
						shopVerw.allesSpeichern(saveKunde,saveMitarbeiter,saveArtikel, saveTransfer, saveRechnungen);
					} else if (input.equals("closeClient")){
							System.out.println("Client abgemeldet");
					}
				
				
					
				} catch (Exception e) {}

				} while (true);
			
	}
	

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		// TODO Auto-generated method stub
		
		EshopServer eshop = new EshopServer();
		eshop.run();
		
	}

}
